package cn.zane.designPattern.createPatterns.singletonPatterns.design;

/**
 * @Author: zane
 * @Date: 2025/01/05
 * @Description: 双重锁校验(线程安全)
 */
public class Singleton_05 {

    // volatile的作用：防止指令重排
    // 单例对象在JVM的创建过程：1.在堆中开辟内存空间 2.实例化对象 3.指针指向内存空间。
    // 由于JVM存在指令重排的优化。加volatile是为了防止 实例化对象和指针指向内存空间顺序颠倒，从而导致临界点时对象未初始化，最终拿不到对象。
    private static volatile Singleton_05 instance;

    private Singleton_05() {
    }

    public static Singleton_05 getInstance() {
        if (null != instance) {
            return instance;
        }
        synchronized (Singleton_05.class) {
            if (null == instance) {
                instance = new Singleton_05();
            }
        }
        return instance;
    }

}
